package com.bluefoxyu.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.bluefoxyu.domain.entity.Course;
import com.bluefoxyu.domain.entity.Teacher;
import com.bluefoxyu.domain.vo.CourseVO;
import com.bluefoxyu.exception.WorkException;
import com.bluefoxyu.mapper.CourseMapper;
import com.bluefoxyu.mapper.TeacherMapper;
import com.bluefoxyu.service.ICourseService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 课程信息表 服务实现类
 * </p>
 *
 * @author bluefoxyu
 * @since 2024-06-16
 */
@Service
public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> implements ICourseService {

    @Resource
    private CourseMapper courseMapper;
    @Resource
    private TeacherMapper teacherMapper;

    @Override
    public void addCourse(Course course) {
        // 一门课程只能有一个教师任课，一个教师可以上多门课程,查询数据库中是否有该课程；
        QueryWrapper<Course> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(Course::getName, course.getName());
        if (courseMapper.selectOne(queryWrapper) != null) {
            // 如果有该课程，则抛出异常或返回错误信息
            throw new WorkException("该课程已存在，一门课程只能有一个教师任课");
        }
        courseMapper.insert(course);
    }

    @Override
    public void updateCourse(Course course) {
        // 一门课程只能有一个教师任课，一个教师可以上多门课程,查询数据库中是否有该课程；
        QueryWrapper<Course> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(Course::getName, course.getName());

        // 如果有该课程，则抛出异常或返回错误信息
        //如果数据表存在同名称的数据，判断查询到的数据和传过来的数据id是否相同，相同说明是同一个数据进行修改，不相同说明存在这个名称的数据，不允许修改
        if (!courseMapper.selectOne(queryWrapper).getId().equals(course.getId())) {
            // 如果有该课程，则抛出异常或返回错误信息
            throw new WorkException("该课程已存在,一门课程只能有一个教师任课");
        }

        // 更新课程信息
        courseMapper.updateById(course);
    }

    @Override
    public List<CourseVO> getAllCourses() {
        List<Course> courseList = courseMapper.selectList(null);
        List<CourseVO>courseVOList=new ArrayList<>();
        for (Course course : courseList) {
            Teacher teacher = teacherMapper.selectById(course.getTeacherId());
            CourseVO courseVO = CourseVO.builder()
                    .id(course.getId())
                    .name(course.getName())
                    .credits(course.getCredits())
                    .teacherId(course.getTeacherId())
                    .teacherName(teacher.getName())
                    .teacherJobTitle(teacher.getJobTitle())
                    .build();
            courseVOList.add(courseVO);
        }
        return courseVOList;
    }
}
